/**
 * API 请求和响应日志记录工具
 * 用于记录所有 API 请求和响应到日志文件
 */

import fs from 'fs';
import path from 'path';
import { fileURLToPath } from 'url';

// 获取当前文件目录
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);

// 默认日志目录
const LOG_DIR = path.resolve(__dirname, '../logs');
const API_LOG_FILE = path.join(LOG_DIR, 'api-requests.log');

/**
 * API 日志记录器
 */
class ApiLogger {
  /**
   * 创建一个 API 日志记录器实例
   * @param {Object} options 配置选项
   * @param {string} options.logDir 日志目录路径
   * @param {string} options.logFile 日志文件名
   * @param {boolean} options.enabled 是否启用日志记录
   */
  constructor(options = {}) {
    this.logDir = options.logDir || LOG_DIR;
    this.logFile = options.logFile || API_LOG_FILE;
    this.enabled = options.enabled !== false; // 默认启用
    this.ensureLogDirExists();
  }

  /**
   * 确保日志目录存在
   */
  ensureLogDirExists() {
    if (!fs.existsSync(this.logDir)) {
      fs.mkdirSync(this.logDir, { recursive: true });
    }
  }

  /**
   * 记录 API 请求
   * @param {string} method HTTP 方法
   * @param {string} url 请求 URL
   * @param {Object|null} headers 请求头
   * @param {Object|null} body 请求体
   * @returns {string} 请求 ID
   */
  logRequest(method, url, headers = null, body = null) {
    if (!this.enabled) return '';

    const requestId = Date.now().toString(36) + Math.random().toString(36).substring(2, 7);
    const timestamp = new Date().toISOString();

    const logEntry = {
      id: requestId,
      timestamp,
      type: 'REQUEST',
      method,
      url,
      headers,
      body
    };

    this.writeLog(logEntry);
    return requestId;
  }

  /**
   * 记录 API 响应
   * @param {string} requestId 请求 ID
   * @param {number} statusCode HTTP 状态码
   * @param {Object|null} headers 响应头
   * @param {Object|null} body 响应体
   * @param {Error|null} error 错误（如果有）
   */
  logResponse(requestId, statusCode, headers = null, body = null, error = null) {
    if (!this.enabled) return;

    const timestamp = new Date().toISOString();

    const logEntry = {
      id: requestId,
      timestamp,
      type: 'RESPONSE',
      statusCode,
      headers,
      body,
      error: error ? {
        message: error.message,
        stack: error.stack
      } : null
    };

    this.writeLog(logEntry);
  }

  /**
   * 写入日志条目到日志文件
   * @param {Object} logEntry 日志条目对象
   */
  writeLog(logEntry) {
    try {
      const logText = JSON.stringify(logEntry) + '\n';
      fs.appendFileSync(this.logFile, logText, 'utf8');
    } catch (err) {
      console.error('写入 API 日志失败:', err.message);
    }
  }

  /**
   * 启用或禁用日志记录
   * @param {boolean} enabled 是否启用
   */
  setEnabled(enabled) {
    this.enabled = enabled;
  }

  /**
   * 清除日志文件
   */
  clearLogs() {
    try {
      if (fs.existsSync(this.logFile)) {
        fs.writeFileSync(this.logFile, '', 'utf8');
      }
    } catch (err) {
      console.error('清除 API 日志失败:', err.message);
    }
  }
}

// 导出默认实例
const apiLogger = new ApiLogger();

export {
  ApiLogger,
  apiLogger
}; 